package com.xygz.orm;

import com.xygz.orm.constants.ORMConstants;
import com.xygz.orm.exception.ORMCheckException;
import com.xygz.orm.exception.ORMException;
import com.xygz.orm.internal.Update;

import java.sql.SQLException;

/**
 * the description for class Updator
 *
 * @author xiyuan-lgz 2023-09-19 @version v1.0.0 新建与整理
 */

@SuppressWarnings("all")
public abstract class Updater<E> extends ConditionWrapper<E, Updater<E>> implements Update<E, Updater<E>>, ORMConstants {
    
    /**
     * 是否自动过滤 null 和 空字符串 或者空集合
     */
    protected boolean isFilterEmptyOrNull = true;
    
    protected Updater(Class<E> rawType) throws ORMException {
        super(rawType);
    }
    
    protected Updater(E en) throws ORMException {
        super(en);
    }
    
    /**
     * 设置 是否自动过滤空值（包括空字符串 和 null）,但是可以通过 set(column value) 方式强制修改
     *
     * <pre>
     * 当实体修改时 字段值为 null 或者 为空字符串的不做修改 例如下 mybatis 语法
     * < if test="item.name == null and item.name != ''">name = #{item.name}</if>
     * </pre>
     *
     * @param autoFilterEmptyOrNull true|false
     * @return 当前修改器
     */
    public Updater<E> setFilterEmptyOrNull(boolean autoFilterEmptyOrNull) {
        this.isFilterEmptyOrNull = autoFilterEmptyOrNull;
        return this;
    }
    
    /**
     * 设置修改实体， 默认自动忽略 实体中 null 和 空值 字段
     *
     * @param entity                实体类
     * @return 当前修改器
     */
    public abstract Updater<E> setEntity(E entity, boolean autoFilterEmptyOrNull);
    
    /**
     * 设置修改实体， 默认自动忽略 实体中 null 和 空值 字段
     *
     * @param entity                实体类
     * @return                      当前修改器
     * @throws ORMCheckException    当类型不匹配时抛出异常
     */
    public Updater<E> setEntity(E entity) throws ORMCheckException {
        this.setEntity(entity, isFilterEmptyOrNull);
        return this;
    }
    
    
    
    /**
     * 执行修改
     * @return 受影响行数
     * @throws ORMException      异常信息
     * @throws SQLException      数据库异常
     */
    public long execute() throws ORMException, SQLException {
        return ORM.db().update(this);
    }
    
    /**
     * 执行修改
     * @return 受影响行数
     * @throws ORMException      异常信息
     * @throws SQLException      数据库异常
     */
    public long execute(String ormId) throws ORMException, SQLException {
        return ORM.db(ormId).update(this);
    }
    
    /**
     * 创建 Updater 查询器
     *
     * @param clz                   表类
     * @param <E>                   表类型
     * @return 修改器
     */
    public static <E> Updater<E> of(Class<E> clz) {
        Class<?> c = Updater.class;
        return create((Class<Updater<E>>) c, clz);
    }
    
    /**
     * 创建 update 修改器, 默认自动忽略 实体中 null 和 空值 字段
     *
     * @param en                    类
     * @param <E>                   表类型
     * @return 查询器对象
     */
    public static <E> Updater<E> of(E en) {
        Class<?> c = Updater.class;
        return create((Class<Updater<E>>) c, en);
    }
    
    /**
     * 创建 update 修改器
     *
     * @param en                    被修改的实体类， 实体类不能为空
     * @param autoFilterEmptyOrNull 是否自动过滤 空值 {@link  Updater#setFilterEmptyOrNull 说明参考 setFilterEmptyOrNull 方法}
     * @return 修改器
     */
    public static <E> Updater<E> of(E en, boolean autoFilterEmptyOrNull) {
        return of(en).setFilterEmptyOrNull(autoFilterEmptyOrNull);
    }
}
